/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ctrl;

import Entity.Feedback;
import Entity.Inserzione;
import Entity.Transazione;
import Entity.Utente;
import Gestore.GestoreRemote;
import Other.Constant;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Vito
 */
@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
public class Servlet extends HttpServlet {

    GestoreRemote gestore = lookupGestoreRemote();
    private String username, password, nome, cognome, indirizzo, citta, provincia, regione;
    private String stato, codiceFiscale, email, localita;
    private GregorianCalendar dataNascita, dataInizio, dataFine;
    private int anno, mese, giorno, idUtente, idInserzione;
    private Utente u;
    private String zona, descrizione, tipoabitazione, parcheggio, altreinfo;
    private short stanzetotali, stanzeinaffitto, postisingoli, postidoppi;
    private String identifier;

    private GestoreRemote lookupGestoreRemote() {
        try {
            Context c = new InitialContext();
            return (GestoreRemote) c.lookup("java:global/EnterpriseApplication1/EnterpriseApplication1-ejb/Gestore!Gestore.GestoreRemote");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String target = "error.jsp";
        String azione = request.getParameter("azione");
        if (azione == null) {
            azione = (String) request.getSession().getAttribute("azione");
        }

        gestore = lookupGestoreRemote();

        Inserzione ins;
        List<Inserzione> inse;

        switch (Integer.parseInt(azione)) {
            case Constant.CREATEUTENTE:
                username = request.getParameter("username");
                password = request.getParameter("password");
                nome = request.getParameter("nome");
                cognome = request.getParameter("cognome");
                indirizzo = request.getParameter("indirizzo");
                citta = request.getParameter("citta");
                provincia = request.getParameter("provincia");
                regione = request.getParameter("regione");
                stato = request.getParameter("stato");
                codiceFiscale = request.getParameter("codiceFiscale");
                dataNascita = new GregorianCalendar();
                anno = Integer.parseInt(request.getParameter("anno"));
                mese = Integer.parseInt(request.getParameter("mese"));
                giorno = Integer.parseInt(request.getParameter("giorno"));
                dataNascita.set(anno, mese, giorno);
                email = request.getParameter("email");
                if ((username != null) && !username.isEmpty() && (password != null) && !password.isEmpty() && gestore.login(username, password) == null) {
                    gestore.createUtente(username, password, nome, cognome, dataNascita, indirizzo, citta, provincia, regione, stato, codiceFiscale, email);
                } else {
                    request.getSession().invalidate();
                    break;
                }

            case Constant.LOGIN:
                username = request.getParameter("username");
                password = request.getParameter("password");
                try {
                    u = gestore.login(username, password);
                    HttpSession session = request.getSession();
                    if (u != null) {
                        session.setMaxInactiveInterval(60);
                        session.setAttribute("user", u);
                        target = "index.jsp";
                        idUtente = u.getId();
                    }else{
                        session.setAttribute("error", "username o password errati");
                    }
                } catch (javax.ejb.EJBException e) {
                }
                break;

            case Constant.LOGIN_EXT:
                identifier = request.getParameter("identifier");
                username = request.getParameter("nickname");
                email = request.getParameter("email");
                nome = request.getParameter("fullname");
                stato = request.getParameter("stato");
                anno = Integer.parseInt(request.getParameter("dob").substring(0, 4));
                mese = Integer.parseInt(request.getParameter("dob").substring(5, 7));
                giorno = Integer.parseInt(request.getParameter("dob").substring(8, 10));
                dataNascita = new GregorianCalendar();
                dataNascita.set(GregorianCalendar.YEAR, anno);
                dataNascita.set(GregorianCalendar.MONTH, mese);
                dataNascita.set(GregorianCalendar.DAY_OF_MONTH, giorno);
                
                try {
                    u = gestore.loginEsterno(username, identifier, nome, dataNascita, "", "", "", "", stato, email) ;
                    if (u != null) {
                        HttpSession session = request.getSession();
                        session.setMaxInactiveInterval(60);
                        session.setAttribute("user", u);
                        target = "index.jsp";
                        idUtente = u.getId();
                    }
                } catch (javax.ejb.EJBException e) {
                }
                break;

            case Constant.LOGOUT:
                request.getSession().invalidate();
                target = "index.jsp";
                username = password = null;
                this.destroy();
                break;

            case Constant.VISUALIZZAINFOUTENTE:
                inse = gestore.findTransazioneByLocatore(idUtente);
                request.getSession().setAttribute("transLocatore", inse);
                inse = gestore.findTransazioneByLocatario(idUtente);
                request.getSession().setAttribute("transLocatario", inse);
                List<Feedback> ricev = gestore.getFeedBackRicevuti(idUtente);
                LinkedList li = new LinkedList();
                if (ricev != null) {
                    for (Feedback f : ricev) {
                        Utente uu=(Utente)gestore.findUtente(f.getAutore());
                        li.add(uu.getNome() + " " + uu.getCognome());
                    }
                }else{li=null;}
                request.getSession().setAttribute("feedRicevuti", ricev);
                request.getSession().setAttribute("feedRicevutiNomi", li);
                target = "profiloUtente.jsp";
                break;

            case Constant.EDITUTENTE:
                username = request.getParameter("username");
                password = request.getParameter("password");
                nome = request.getParameter("nome");
                cognome = request.getParameter("cognome");
                indirizzo = request.getParameter("indirizzo");
                citta = request.getParameter("citta");
                provincia = request.getParameter("provincia");
                regione = request.getParameter("regione");
                stato = request.getParameter("stato");
                codiceFiscale = request.getParameter("codiceFiscale");
                dataNascita = new GregorianCalendar();
                anno = Integer.parseInt(request.getParameter("anno"));
                mese = Integer.parseInt(request.getParameter("mese"));
                giorno = Integer.parseInt(request.getParameter("giorno"));
                dataNascita.set(anno, mese, giorno);
                email = request.getParameter("email");
                idUtente = Integer.parseInt(request.getParameter("id"));
                if ((username != null) && (password != null)) {
                    gestore.editUtente(username, password, nome, cognome, dataNascita, indirizzo, citta, provincia, regione, stato, codiceFiscale, email, idUtente);
                    HttpSession s = request.getSession();
                    s.setMaxInactiveInterval(60);
                    s.removeAttribute("user");
                    s.setAttribute("user", gestore.findUtente(idUtente));
                    target = "index.jsp";
                }
                break;

            case Constant.REMOVEUTENTE:
                u = (Utente) request.getSession().getAttribute("user");
                idUtente = u.getId();
                gestore.removeUtente(idUtente);
                request.getSession().invalidate();
                target = "index.jsp";
                break;

            //INSERZIONE
            case Constant.CREATEINSERZIONE:
                GregorianCalendar inizioC = new GregorianCalendar();
                GregorianCalendar fineC = new GregorianCalendar();

                Integer idutente = Integer.parseInt(request.getParameter("idUtente"));
                regione = (String) request.getParameter("regione");
                provincia = (String) request.getParameter("provincia");
                localita = (String) request.getParameter("localita");
                indirizzo = (String) request.getParameter("indirizzo");
                zona = (String) request.getParameter("zona");
                descrizione = (String) request.getParameter("descrizione");
                tipoabitazione = (String) request.getParameter("tipoAbitazione");
                stanzetotali = Short.parseShort(request.getParameter("stanzeTotali"));
                stanzeinaffitto = Short.parseShort(request.getParameter("stanzeInAffitto"));
                postisingoli = Short.parseShort(request.getParameter("postiSingoli"));
                postidoppi = Short.parseShort(request.getParameter("postiDoppi"));
                parcheggio = (String) request.getParameter("parcheggio");
                altreinfo = (String) request.getParameter("altreInfo");

                Integer annoIC = Integer.parseInt(request.getParameter("annoi"));
                Integer meseIC = Integer.parseInt(request.getParameter("mesei"));
                Integer giornoIC = Integer.parseInt(request.getParameter("giornoi"));
                Integer annoFC = Integer.parseInt(request.getParameter("annof"));
                Integer meseFC = Integer.parseInt(request.getParameter("mesef"));
                Integer giornoFC = Integer.parseInt(request.getParameter("giornof"));

                inizioC.set(annoIC, meseIC, giornoIC);
                fineC.set(annoFC, meseFC, giornoFC);

                gestore.createInserzione(idutente, regione, provincia, localita, indirizzo, zona, descrizione, tipoabitazione,
                        stanzetotali, stanzeinaffitto, postisingoli, postidoppi, parcheggio, altreinfo, inizioC, fineC);
                target = "index.jsp";
                break;

            case Constant.EDITINSERZIONE:

                GregorianCalendar inizioE = new GregorianCalendar();
                GregorianCalendar fineE = new GregorianCalendar();

                idInserzione = Integer.parseInt(request.getParameter("idInserzione"));
                regione = (String) request.getParameter("regione");
                provincia = (String) request.getParameter("provincia");
                localita = (String) request.getParameter("localita");
                indirizzo = (String) request.getParameter("indirizzo");
                zona = (String) request.getParameter("zona");
                descrizione = (String) request.getParameter("descrizione");
                tipoabitazione = (String) request.getParameter("tipoAbitazione");
                stanzetotali = Short.parseShort(request.getParameter("stanzeTotali"));
                stanzeinaffitto = Short.parseShort(request.getParameter("stanzeInAffitto"));
                postisingoli = Short.parseShort(request.getParameter("postiSingoli"));
                postidoppi = Short.parseShort(request.getParameter("postiDoppi"));
                parcheggio = (String) request.getParameter("parcheggio");
                altreinfo = (String) request.getParameter("altreInfo");

                Integer annoI = Integer.parseInt(request.getParameter("annoi"));
                Integer meseI = Integer.parseInt(request.getParameter("mesei"));
                Integer giornoI = Integer.parseInt(request.getParameter("giornoi"));
                Integer annoF = Integer.parseInt(request.getParameter("annof"));
                Integer meseF = Integer.parseInt(request.getParameter("mesef"));
                Integer giornoF = Integer.parseInt(request.getParameter("giornof"));

                inizioE.set(annoI, meseI, giornoI);
                fineE.set(annoF, meseF, giornoF);

                gestore.editInserzione(idInserzione, regione, provincia, localita, indirizzo, zona, descrizione, tipoabitazione,
                        stanzetotali, stanzeinaffitto, postisingoli, postidoppi, parcheggio, altreinfo, inizioE, fineE);

                target = "index.jsp";
                break;

            case Constant.EDITINSERZIONEPAGE:
                Integer idIns = Integer.parseInt(request.getParameter("idInserzione"));
                target = "editInserzione.jsp";
                ins = (Inserzione) gestore.findInserzione(idIns);
                request.getSession().setAttribute("inserzione", ins);
                break;

            case Constant.REMOVEINSERZIONE:
                Integer idI = Integer.parseInt(request.getParameter("idInserzione"));
                gestore.removeInserzione(idI);
                target = "index.jsp";
                break;

            case Constant.FINDALLINSERZIONE:
                tipoabitazione = (String) request.getParameter("tipoAbitazione");
                zona = (String) request.getParameter("zona");
                regione = (String) request.getParameter("regione");
                provincia = (String) request.getParameter("provincia");
                localita = (String) request.getParameter("localita");
                parcheggio = (String) request.getParameter("parcheggio");

                inse = (List<Inserzione>) gestore.findInserzioneByParameters(tipoabitazione, zona, regione, provincia, localita, parcheggio);
                request.getSession().setAttribute("inserzioni", inse);
                target = "inserzioni.jsp";
                break;

            case Constant.FINDINSERZIONE:
                inse = (List<Inserzione>) gestore.findInserzioneByLocatore(idUtente);
                request.getSession().setAttribute("inserzioni", inse);
                target = "inserzioni.jsp";
                break;

            case Constant.PRENOTAZIONE:
                Inserzione inserzione = new Inserzione();
                Integer idins;
                idins = Integer.parseInt(request.getParameter("idInserzione"));
                inserzione = gestore.findInserzione(idins);
                request.getSession().setAttribute("inserzione", inserzione);
                target = "prenotazione.jsp";
                break;

            case Constant.CONTROLLADATE:
                ins = (Inserzione) request.getSession().getAttribute("inserzione");
                dataInizio = new GregorianCalendar();
                dataFine = new GregorianCalendar();
                annoI = Integer.parseInt(request.getParameter("annoi"));
                meseI = Integer.parseInt(request.getParameter("mesei"));
                giornoI = Integer.parseInt(request.getParameter("giornoi"));
                annoF = Integer.parseInt(request.getParameter("annof"));
                meseF = Integer.parseInt(request.getParameter("mesef"));
                giornoF = Integer.parseInt(request.getParameter("giornof"));

                dataInizio.set(annoI, meseI, giornoI);
                dataFine.set(annoF, meseF, giornoF);
                if (gestore.controllaDate(ins, dataInizio, dataFine) == true) {
                    target = "confermaPrenotazione.jsp";
                    request.getSession().setAttribute("dataInizio", dataInizio);
                    request.getSession().setAttribute("dataFine", dataFine);
                } else {
                    request.getSession().setAttribute("error", "date non valide.");
                }
                break;

            case Constant.CREATETRANSAZIONE:
                ins = (Inserzione) request.getSession().getAttribute("inserzione");
                idIns = ins.getId();
                idUtente = u.getId();
                dataInizio = (GregorianCalendar) request.getSession().getAttribute("dataInizio");
                dataFine = (GregorianCalendar) request.getSession().getAttribute("dataFine");
                gestore.createTransazione(idIns, idUtente, (GregorianCalendar) GregorianCalendar.getInstance(), dataInizio, dataFine);
                target = "index.jsp";
                break;


            //FEEDBACK
            case Constant.CREATEFEEDBACKLOCATARIO:

                GregorianCalendar dataFeed1 = new GregorianCalendar();
                anno = dataFeed1.get(GregorianCalendar.YEAR);
                mese = dataFeed1.get(GregorianCalendar.MONTH);
                giorno = dataFeed1.get(GregorianCalendar.DAY_OF_MONTH);

                int idTransazione = Integer.parseInt(request.getParameter("idTransazione"));
                Transazione t = gestore.findTransazione(idTransazione);
                dataFeed1.set(anno, mese, giorno);

                try {
                    gestore.createFeedbackLocatario(t.getLocatario().getId(), t.getInserzione().getLocatore().getId(), idTransazione, dataFeed1, request.getParameter("descrizione"), Short.parseShort(request.getParameter("punteggio")));
                    target = "index.jsp";
                } catch (Exception e) {
                    e.printStackTrace();
                }

                break;


            case Constant.CREATEFEEDBACKLOCATORE:

                GregorianCalendar dataFeed2 = new GregorianCalendar();
                anno = dataFeed2.get(GregorianCalendar.YEAR);
                mese = dataFeed2.get(GregorianCalendar.MONTH);
                giorno = dataFeed2.get(GregorianCalendar.DAY_OF_MONTH);

                int idTransazion = Integer.parseInt(request.getParameter("idTransazione"));
                Transazione t2 = gestore.findTransazione(idTransazion);
                dataFeed2.set(anno, mese, giorno);

                try {
                    gestore.createFeedbackLocatore(t2.getInserzione().getLocatore().getId(), t2.getLocatario().getId(), idTransazion, dataFeed2, request.getParameter("descrizione"), Short.parseShort(request.getParameter("punteggio")));
                    target = "index.jsp";
                } catch (Exception e) {
                    e.printStackTrace();
                }

                break;

        }
        response.sendRedirect(target);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
